﻿/**
 * 主窗口类的构造方法。
 */
function MainWindow() {
    var mGame = null                                                                // 游戏
    const mLabelRivalName = document.getElementById("IDC_LABEL_RIVAL_NAME")         // "当前对手"标签
    const mMenuItemDefeat = document.getElementById("IDC_MENU_ITEM_DEFEAT")         // "认输"菜单项
    const mMenuItemFindUsers = document.getElementById("IDC_MENU_ITEM_FIND_RIVAL")  // "寻找其它用户"菜单项
    const mMenuItemRestart = document.getElementById("IDC_MENU_ITEM_RESTART")       // “再来一局"菜单项
    var mRivalWindow = null                                                         // 对手列表窗口

    // 设置标题
    document.title = IDS_APP_NAME[LANG]
    
    // 订阅事件
    document.addEventListener(Const.UM_CONNECTED, onConnected)
    document.addEventListener(Const.UM_GET_FIND_USERS_RESULT, onGetFindUsersResult)
    document.addEventListener(Const.UM_GET_INVITE_REQUEST, onGetInviteRequest)
    document.addEventListener(Const.UM_GET_INVITE_RESULT, onGetInviteResult)
    document.addEventListener(Const.UM_GET_LOGON_RESULT, onGetLogonResult)
    document.addEventListener(Const.UM_GET_RIVAL_NAME, onGetRivalName)
    document.addEventListener(Const.UM_GAME_OVER, onGameOver)
    document.addEventListener(Const.UM_GAME_START, onGameStart)
    document.addEventListener(Const.UM_RIVAL_QUIT_GAME, onRivalQuitGame)

    // 添加窗口关闭事件监听者
    window.onbeforeunload = onWindowClosing

    // "当前对手"标签
    mLabelRivalName.innerHTML = IDS_CURRENT_RIVAL[LANG]

    // 设置菜单项
    const menuGame = document.getElementById("IDC_MENU_GAME")
    menuGame.innerHTML = IDS_GAME[LANG]
    mMenuItemDefeat.style.display = "none"
    mMenuItemRestart.style.display = "none"

    // "认输"菜单项
    mMenuItemDefeat.innerHTML = IDS_DEFEAT[LANG]
    mMenuItemDefeat.onclick = onMenuItemDefeatClicked

    // "寻找其它用户"菜单项
    mMenuItemFindUsers.innerHTML = IDS_FIND_USERS[LANG]
    mMenuItemFindUsers.onclick = onMenuItemFindUsersClicked

    // “再来一局"菜单项
    mMenuItemRestart.innerHTML = IDS_RESTART[LANG]
    mMenuItemRestart.onclick = onMenuItemRestartClicked

    // 创建对手列表窗口
    mRivalWindow = new RivalWindow(document.getElementById("IDC_MAIN_WINDOW"))

    // 创建游戏区域
    const gameBoard = new GameBoard("IDC_GAME_BOARD")
    gameBoard.onclick = onGameBoardClicked

    // 创建游戏
    mGame = new Game(gameBoard.getDrawer(), gameBoard)

    /**
     * 网络连接完成事件的响应方法。
     * @param e 事件相关信息
     */
    function onConnected(e) {
        const result = e.arg1
        if (result) {
            // 登录
            const username = InputBox.getStringValue(IDS_INPUT_USERNAME[LANG], "")
            if (username == null) {
                mGame.close()
                window.close()
            }
            mGame.logon(username)
        } else {
            // 弹出提示
            window.alert(IDS_NETWORK_ERROR[LANG])
            window.close()
        }
    }

    /**
     * 单击游戏区域事件的响应方法。
     * @param e 事件相关信息
     */
    function onGameBoardClicked(e) {
        if (mGame != null) {
            mGame.onGameBoardClicked(e.x, e.y - Const.GRID_SIZE)
        }
    }

    /**
     * 游戏结束事件的响应方法。
     * @param e 事件相关信息
     */
    function onGameOver(e) {
        // 设置菜单项
        mMenuItemFindUsers.style.display = "block"
        mMenuItemDefeat.style.display = "none"
        mMenuItemRestart.style.display = "block"

        const isBlack = e.arg2
        
        // 显示提示信息
        switch (e.arg1) {
            case GameOverReason.LOST:
                window.alert(IDS_LOST[LANG])
                break
            case GameOverReason.RIVAL_ADMIT:
                window.alert(IDS_RIVAL_ADMIT[LANG])
                break
            case GameOverReason.SELF_ADMIT:
                window.alert(IDS_SELF_ADMIT[LANG])
                break
            case GameOverReason.WON:
                window.alert(IDS_WON[LANG])
                break
        }
    }

    /**
     * 游戏开始事件的响应方法。
     * @param e 事件相关信息
     */
    function onGameStart(e) {
        // 隐藏对手列表窗口
        mRivalWindow.hide()
        
        // 设置菜单项
        mMenuItemFindUsers.style.display = "none"
        mMenuItemDefeat.style.display = "block"
        mMenuItemRestart.style.display = "none"
        
        // 显示对手的名字
        mLabelRivalName.innerHTML = IDS_CURRENT_RIVAL[LANG] + e.arg1
    }

    /**
     * 得到寻找用户结果事件的响应方法。
     * @param e 事件相关信息
     */
    function onGetFindUsersResult(e) {
        if (e.arg1.mUsernameList != null) {
            mRivalWindow.setUsernameList(e.arg1.mUsernameList)
            mRivalWindow.show()
        }
    }

    /**
     * 得到挑战请求事件的响应方法。
     * @param e 事件相关信息
     */
    function onGetInviteRequest(e) {
        var question = e.arg1 + IDS_INVITE[LANG]
        var accept = window.confirm(question)
        mGame.acceptInvite(e.arg1, accept)
    }

    /**
     * 得到挑战结果事件的响应方法。
     * @param e 事件相关信息
     */
    function onGetInviteResult(e) {
        var information = e.arg1
        if (e.arg2) {
            information += IDS_ACCEPT[LANG]
        } else {
            information += IDS_REFUSE[LANG]
        }
        window.alert(information)
    }

    /**
     * 得到登录结果事件的响应方法。
     * @param e 事件相关信息
     */
    function onGetLogonResult(e) {
        if (e.arg1) {
            window.alert(IDS_LOGON_SUCCEEDED[LANG])
        } else {
            window.alert(IDS_LOGON_FAILED[LANG])
            logon()
        }
    }
    
    /**
     * 获取对手的名字事件的响应方法。
     * @param e 事件相关信息
     */
    function onGetRivalName(e) {
        mGame.invite(e.arg1)
    }

    /**
     * "认输"菜单项的单击响应方法。
     */
    function onMenuItemDefeatClicked() {
        mGame.defeat()
    }

    /**
     * "寻找其它用户"菜单项的单击响应方法。
     */
    function onMenuItemFindUsersClicked() {
        mGame.findUsers()
    }

    /**
     * "再来一局"菜单项的单击响应方法。
     */
    function onMenuItemRestartClicked() {
        mGame.restart()
    }

    /**
     * 对手退出游戏事件的响应方法。
     * @param e 事件相关信息
     */
    function onRivalQuitGame(e) {
        // 设置菜单项
        mMenuItemFindUsers.style.display = "block"
        mMenuItemDefeat.style.display = "none"
        mMenuItemRestart.style.display = "none"
        
        // 设置状态栏
        mLabelRivalName.innerHTML = IDS_CURRENT_RIVAL[LANG]
        
        // 显示提示信息
        var text = e.arg2
        if (e.arg1) {
            text += IDS_RIVAL_ESCAPE[LANG]
        } else {
            text += IDS_RIVAL_QUIT[LANG]
        }
        window.alert(text)
    }

    /**
     * 窗口关闭中事件的响应方法。
     */
    function onWindowClosing() {
        mGame.close()
    }
}
